package com.fufu.algorithem.stack;

import java.util.Arrays;
import java.util.Stack;

/**
 * 理想的逆波兰表达式：支持+ - * / ()、小数、多位数、负数、兼容处理过滤空白字符、包括空格、制表符、换页符
 * @author: BlcakTiger
 * @date: 2023/2/15 10:49
 * @contact: hsf6661@163.com
 */
public class PRNIdeal {

    public static void main(String[] args) {
        //创建一个中缀表达式
        String inFixExp = "(34  + 5.3\t) *6";
        //格式化中缀表达方：转换成方便处理的形式
        String inFixTrim = trimFormat(inFixExp);

        System.out.println("original:"+inFixExp);
        System.out.println("trim:"+inFixTrim);

        //将中缀表达式转换为后缀表达式
        String suffix = InFixToSuffix.toSuffix(inFixTrim);

        System.out.println("suffix:"+suffix);
        //计算结果
        double res = RPN.reversePolishCalculator(suffix);
        //Math.round(res*100)/100.0  对res进行四舍五入，*100是为了保留小数部分，四舍五入后再/100取出小数部分
        //String.format("%.2f",Math.round(res*100)/100.0) 格式化小数，%.2f表示只保留小数点后2为（按截取方式）
        System.out.println("value of the expression is " +String.format("%.2f",Math.round(res*100)/100.0));
    }

    /**
     * 去掉original两端及里面的空白符并格式化字符串,如：" "、'\t'、'\n'
     * @param original 原先的字符串
     * @return 修剪后的字符串
     */
    public static String trimFormat(String original){
        //初始化一个可变字符串
        StringBuilder trimed = new StringBuilder();
        for (int i = 0; i < original.length(); i++) {
            if (original.charAt(i)==' '||original.charAt(i)=='\t'||original.charAt(i)=='\n'){
                continue;
            }
            trimed.append(original.charAt(i));
        }
        String str = trimed.toString();
        String temp = "";
        char ch;
        trimed.delete(0,trimed.length());
        for (int i = 0; i < str.length()-1; i++) {
            ch = str.charAt(i);
            if (ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'){
                trimed.append(ch+" ");
            } else{
                //优化表达式
                if (((ch+"").matches("\\d")|| ch=='.') && (str.charAt(i+1)>='0'&&str.charAt(i+1)<='9' || str.charAt(i+1)=='.')){
                    temp += str.charAt(i);
                }else {
                    temp += str.charAt(i);
                    trimed.append(temp+" ");
                    temp = "";
                }
            }
        }
        //因为每次循环为了能够查看到一个数的下一位是否也是数字，所以在循环时需要减少1次
        //故而遍历结束后表达式还有一个末尾的数没有拼接到trimed中
        trimed.append(str.charAt(str.length()-1));

        return trimed.toString();
    }
}
